package com.wujie.mall.domain.pricing;

import lombok.Data;
import lombok.Builder;
import lombok.AllArgsConstructor;
import lombok.NoArgsConstructor;

import java.math.BigDecimal;
import java.time.LocalDateTime;
import java.util.List;
import java.util.Map;

/**
 * 定价上下文
 * 
 * 封装了定价策略执行所需的所有上下文信息，包括：
 * - 商品信息
 * - 用户信息
 * - 订单信息
 * - 促销信息
 * - 环境信息（时间、地区等）
 * 
 * @author wujie
 * @since 2024-08-26
 */
@Data
@Builder
@AllArgsConstructor
@NoArgsConstructor
public class PricingContext {

    /**
     * 商品ID
     */
    private Long productId;

    /**
     * SKU ID
     */
    private Long skuId;

    /**
     * 商品原价
     */
    private BigDecimal originalPrice;

    /**
     * 购买数量
     */
    private Integer quantity;

    /**
     * 用户ID
     */
    private Long userId;

    /**
     * 用户等级（NORMAL, VIP, SVIP等）
     */
    private String userLevel;

    /**
     * 用户地区
     */
    private String userRegion;

    /**
     * 订单总金额
     */
    private BigDecimal orderAmount;

    /**
     * 是否首次购买
     */
    private Boolean isFirstPurchase;

    /**
     * 计算时间
     */
    private LocalDateTime calculateTime;

    /**
     * 促销活动ID列表
     */
    private List<Long> promotionIds;

    /**
     * 优惠券ID列表
     */
    private List<Long> couponIds;

    /**
     * 商品分类ID
     */
    private Long categoryId;

    /**
     * 品牌ID
     */
    private Long brandId;

    /**
     * 扩展属性
     */
    private Map<String, Object> attributes;

    /**
     * 是否允许使用优惠券
     */
    private Boolean allowCoupon;

    /**
     * 是否允许积分抵扣
     */
    private Boolean allowPoints;

    /**
     * 用户积分余额
     */
    private Integer userPoints;

    /**
     * 获取扩展属性
     * @param key 属性键
     * @param defaultValue 默认值
     * @return 属性值
     */
    @SuppressWarnings("unchecked")
    public <T> T getAttribute(String key, T defaultValue) {
        if (attributes == null) {
            return defaultValue;
        }
        return (T) attributes.getOrDefault(key, defaultValue);
    }

    /**
     * 设置扩展属性
     * @param key 属性键
     * @param value 属性值
     */
    public void setAttribute(String key, Object value) {
        if (attributes == null) {
            attributes = new java.util.HashMap<>();
        }
        attributes.put(key, value);
    }

    /**
     * 检查是否为VIP用户
     * @return 是否为VIP
     */
    public boolean isVipUser() {
        return "VIP".equalsIgnoreCase(userLevel) || "SVIP".equalsIgnoreCase(userLevel);
    }

    /**
     * 检查是否为超级VIP用户
     * @return 是否为SVIP
     */
    public boolean isSvipUser() {
        return "SVIP".equalsIgnoreCase(userLevel);
    }

    /**
     * 检查是否有促销活动
     * @return 是否有促销
     */
    public boolean hasPromotion() {
        return promotionIds != null && !promotionIds.isEmpty();
    }

    /**
     * 检查是否有优惠券
     * @return 是否有优惠券
     */
    public boolean hasCoupon() {
        return couponIds != null && !couponIds.isEmpty();
    }

    /**
     * 检查是否为工作日
     * @return 是否为工作日
     */
    public boolean isWorkday() {
        if (calculateTime == null) {
            calculateTime = LocalDateTime.now();
        }
        int dayOfWeek = calculateTime.getDayOfWeek().getValue();
        return dayOfWeek >= 1 && dayOfWeek <= 5; // 周一到周五
    }

    /**
     * 检查是否为节假日
     * @return 是否为节假日
     */
    public boolean isHoliday() {
        return !isWorkday();
    }

    /**
     * 获取总计金额（原价 * 数量）
     * @return 总计金额
     */
    public BigDecimal getTotalAmount() {
        if (originalPrice == null || quantity == null) {
            return BigDecimal.ZERO;
        }
        return originalPrice.multiply(BigDecimal.valueOf(quantity));
    }
}